26. 某国际电商平台销售数据分析

⭐ 本章概览:电商数据的多维度分析

电商平台的核心数据分析问题:

  • 折扣策略:多大折扣最优?
  • 利润分析:折扣与利润的关系是什么?
  • 品类表现:哪些品类利润高?
  • 定价策略:如何平衡销量与利润?

⭐ 分析思路与数据说明

数据来源:某国际电商平台(Superstore)销售数据

分析框架

  • 读取并清洗电商销售数据
  • 探究同一天的折扣策略差异
  • 分析不同品类的折扣情况
  • 研究折扣与利润的总体关系
  • 可视化折扣与业务指标

⭐ 数据准备:导入库与读取数据

Listing 1
# 注:superstore.xlsx 数据文件本地没有,但平台已经内置
# 导入数据分析库
import pandas as pd  # 数据表操作
import matplotlib.pyplot as plt  # 绘图
import seaborn as sns  # 高级统计绘图
from datetime import datetime  # 日期时间处理

⭐ 数据读取与清洗

Listing 2
# 注:superstore.xlsx 数据文件本地没有,此处无法实际运行
# data = pd.read_excel('superstore.xlsx')  # 读取Excel销售数据
# del data['Postal Code']  # 删除邮政编码字段(缺失值多,分析贡献有限)
# print('数据形状:', data.shape)
# print(data.head())
  • 使用 pd.read_excel() 读取 Excel 格式销售数据
  • 删除缺失值较多的 Postal Code 字段
  • 通过 .shape.head() 初步了解数据规模与结构

⭐ 问题1:每天是否采用统一折扣?

分析方法:按订单日期分组,统计每天折扣种类数量

Listing 3
# 注:依赖 superstore.xlsx 数据,此处展示分析逻辑
# daily_discounts = data.groupby('Order Date').Discount.nunique()
# print(daily_discounts.head(10))
# print(f'平均每天折扣种类数: {daily_discounts.mean():.2f}')

结论:同一天不同商品会采取不同的折扣

⭐ 问题2:各品类折扣情况如何?

分析方法:按子品类和折扣力度分组,统计利润与天数

Listing 4
# 注:依赖 superstore.xlsx 数据,此处展示分析逻辑
# category_discount = data.groupby(['Sub-Category', 'Discount']).agg({
#     'Profit': 'sum',        # 计算该品类在该折扣下的总利润
#     'Order Date': 'nunique'  # 统计该折扣持续的天数
# })
# category_discount['Profit_per_day'] = (
#     category_discount['Profit'] / category_discount['Order Date']
# )
# print(category_discount.head(15))

结论:不同品类的商品,折扣力度并不相同

⭐ 问题3:折扣与利润的总体关系

核心思路:剔除品类数量和折扣时间的影响

  • 按折扣分组,汇总销量、销售额、利润等指标
  • 计算单位时间内每个产品的平均值
  • 过滤掉样本量过小的极端折扣

⭐ 按折扣分组统计业务指标

Listing 5
# 注:依赖 superstore.xlsx 数据,此处展示分析逻辑
# profit_by_discount = data.groupby('Discount').agg({
#     'Quantity': 'sum',       # 总销量
#     'Sales': 'sum',          # 总销售额
#     'Profit': 'sum',         # 总利润
#     'Order Date': 'nunique', # 不重复日期数
#     'Product Name': 'nunique' # 不重复产品数
# })
# profit_by_discount.columns = [
#     'Quantity_sum', 'Sales_sum', 'Profit_sum',
#     'Dates_sum', 'Products_sum'
# ]

⭐ 计算单位时间每产品的平均指标

核心公式

\[ \text{平均利润} = \frac{\text{总利润}}{\text{产品数} \times \text{天数}} \]

Listing 6
# 注:依赖 superstore.xlsx 数据,此处展示分析逻辑
# profit_by_discount['Profit_p_p'] = (
#     profit_by_discount['Profit_sum'] /
#     profit_by_discount['Products_sum'] /
#     profit_by_discount['Dates_sum']
# )  # 每产品每天平均利润
#
# profit_by_discount['Sales_p_p'] = (
#     profit_by_discount['Sales_sum'] /
#     profit_by_discount['Products_sum'] /
#     profit_by_discount['Dates_sum']
# )  # 每产品每天平均销售额
#
# profit_by_discount['Quantity_p_p'] = (
#     profit_by_discount['Quantity_sum'] /
#     profit_by_discount['Products_sum'] /
#     profit_by_discount['Dates_sum']
# )  # 每产品每天平均销量

⭐ 过滤极端值与数据可视化

Listing 7
# 注:依赖 superstore.xlsx 数据,此处展示分析逻辑
# profit_filtered = profit_by_discount.query('Products_sum > 19')
# sns.set(style='darkgrid')
# plt.figure(figsize=(10, 6))
# for metric, label in zip(
#     ['Profit_p_p', 'Sales_p_p', 'Quantity_p_p'],
#     ['平均利润', '平均销售额', '平均销售数量']
# ):
#     sns.lineplot(x='Discount', y=metric, label=label, data=profit_filtered)
# plt.legend()
# plt.xlabel('折扣')
# plt.ylabel('数值')
# plt.title('折扣与业务指标关系')
# plt.show()
  • 过滤条件:仅保留产品种类数 > 19 的折扣记录
  • 排除样本量过小的极端情况,提高分析可靠性

⭐ 关键发现:利润拐点

折扣20%是利润正负的拐点

折扣区间 利润情况 策略建议
< 20% 利润为正 安全区间
> 20% 利润为负 需谨慎使用

⭐ 关键发现:最优折扣策略

低折扣「小刀」策略效果最佳

  • 折扣 0.2% 和 7% 时,单位时间利润显著提升
  • 小幅折扣可有效刺激消费者购买欲望
  • 同时提升销量和利润

⭐ 关键发现:极端折扣的警示

85%、55%、57% 折扣出现极端负利润

  • 属于特定商品、网红商品的引流活动
  • 对整体商品定价策略不具备代表性
  • 分析时应将其过滤排除

⭐ 商业建议总结

策略方向 具体建议
常规定价 控制折扣在 20% 以内
促销策略 小幅折扣(0.2%-7%)效果最佳
避免亏损 谨慎使用高折扣促销
差异化定价 不同品类采用不同折扣策略

⭐ 平台任务解答代码

Listing 8
# 注:superstore.xlsx 数据文件本地没有,但平台已经内置
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
# 导入必要的包
import pandas as pd # 用于数据处理和分析
import matplotlib.pyplot as plt # 用于绘图
import seaborn as sns # 用于高级绘图
from datetime import datetime # 用于处理日期时间数据

# 读取Excel文件
data = pd.read_excel('superstore.xlsx')  

# 删除Postal Code字段
del data['Postal Code']  
print(data.head())  # 输出前几行数据

# 折扣与销售利润关系探究

# 判断每一天是不是同一个折扣
huigui01 = data.groupby('Order Date').Discount.nunique()  
print(huigui01.head())  # 输出前几行数据

# 判断每个品类的折扣情况
huigui03 = data.groupby(['Sub-Category', 'Discount']).agg({
  'Profit': 'sum', # 计算每个子类别和折扣组合的总利润
  'Order Date': 'nunique', # 计算每个子类别和折扣组合的唯一订单日期数量
})  # 数据结构定义结束
huigui03['Profit_pd'] = huigui03['Profit'] / huigui03['Order Date'] # 计算单位时间内的平均利润
print(huigui03.head(15)) # 打印前15行结果,检查每个子类别和折扣组合的利润情况

# 通过前面的判断,可以发现:
# 1)同一天不同商品会采取不同的折扣;
# 2)不同品类的商品,折扣力度也并不相同;
# 为了简化问题,我们将所有销售数据按照折扣分组,然后对销量、销售额、利润等数据进行汇总聚合;
# 同时,考虑到折扣促销的本质,就是为了通过降价提高销量,相应单个产品的利润会有所下降,但是单个品类、单位时间的利润总和会得到提升;
# 因此我们在探究折扣与利润之间关系时候,需要剔除品类数量、折扣时间的影响。

# 按折扣分组,计算汇总指标
profit_8discount = data.groupby('Discount').agg({
  'Quantity': 'sum', # 计算每个折扣下的总销售数量
  'Sales': 'sum', # 计算每个折扣下的总销售额
  'Profit': 'sum', # 计算每个折扣下的总利润
  'Order Date': 'nunique', # 计算每个折扣下的唯一订单日期数量
  'Product Name': 'nunique', # 计算每个折扣下的唯一商品名称数量
})  # 数据结构定义结束

# 重命名列
profit_8discount.columns = ['Quantity_sum', 'Sales_sum', 'Profit_sum', 'Dates_sum', 'Products_sum']

# 计算单位时间内每个商品的平均利润、平均销售额和平均销售数量
profit_8discount['Profit_p_p'] = profit_8discount['Profit_sum'] / profit_8discount['Products_sum'] / profit_8discount['Dates_sum'] # 平均利润
profit_8discount['Sales_p_p'] = profit_8discount['Sales_sum'] / profit_8discount['Products_sum'] / profit_8discount['Dates_sum'] # 平均销售额
profit_8discount['Quantity_p_p'] = profit_8discount['Quantity_sum'] / profit_8discount['Products_sum'] / profit_8discount['Dates_sum'] # 平均销售数量

# 重置索引,方便后续操作
profit_8discount = profit_8discount.reset_index()
print(profit_8discount)  # 输出利润数据

# 选取折扣涉及商品种类大于(商品种类总数)*0.005的情形;
profit_8discount22 = profit_8discount.query('Products_sum > 19') 
print(profit_8discount22)  # 输出利润数据

# 绘制折扣与利润关系的折线图
sns.set(style="darkgrid") # 设置绘图风格为'darkgrid'
plt.figure(figsize=(10, 6)) # 设置画布大小

# 遍历需要绘制的列(平均利润、平均销售额、平均销售数量)
for i in profit_8discount22.columns[6:-2]:
  ax = sns.lineplot(x='Discount', y=i, label=i, data=profit_8discount22)  # 绑制折线图

# 添加图例和标签
plt.legend() # 显示图例
plt.xlabel('Discount Range') # 设置x轴标签
plt.ylabel('Sales') # 设置y轴标签
plt.savefig("10.png") # 保存图表为PNG文件
plt.show() # 显示图表

# 通过分析发现:
# 1)销售折扣20%(折扣为0.2表示打8折(即降价20%))是销售利润正负的拐点,当折扣继续增加,销售利润基本为负值。
# 2)当折扣为0.002和0.07时,单个品类单位时间的总利润有显著的提升,也就是营销中低折扣的"小刀"策略,可以有效刺激消费者购买欲望,进而提升销量和利润。
# 3)当折扣为0.85、0.55、0.57的时候,利润会出现一些极端的负数值,通过查看对应的商品种类和该折扣销售天数,
# 可以发现此种情况是特殊个例,属于基于特定商品、网红商品的引流活动,对整体商品的定价策略不具备代表性。